uml: add 6.12 testing kernel
authorChristian Lamparter <[email protected]>
Sat, 26 Apr 2025 02:23:21 +0000 (04:23 +0200)
committerChristian Lamparter <[email protected]>
Wed, 28 May 2025 16:22:41 +0000 (18:22 +0200)
refresh config + patches.

This includes the following changes:
 - The selected x86_64 CPU is switched to generic instead of K8.

A backported patch is included from 6.13.

000-v6.13-asm-generic-io.h-rework-split-ioread64-iowrite64-hel.patch
|fixed the following build error:
|  CC      lib/iomap.o
|lib/iomap.c:156:5: error: no previous prototype for 'ioread64_lo_hi' [-Werror=missing-prototypes]
|  156 | u64 ioread64_lo_hi(const void __iomem *addr)
|      |     ^~~~~~~~~~~~~~
| [...]

Note: 102-pseudo-random-mac.patch will likely go away with the next stable.
UML is switching to a new networking infrastructure. The previous implementation
using tuntap, daemon, socket, ethertap, vde are being replaced by "vector"
transports tap, hybrid, raw, EoGRE, Eol2tpv3, fd, vde (vector!).

Please see, to checkout what will change:
<https://docs.kernel.org/virt/uml/user_mode_linux_howto_v2.html#setting-up-uml-networking>

Signed-off-by: Christian Lamparter <[email protected]>
target/linux/uml/Makefile
target/linux/uml/config-6.12 [new file with mode: 0644]
target/linux/uml/config-6.6 [deleted file]
target/linux/uml/patches-6.12/000-v6.13-asm-generic-io.h-rework-split-ioread64-iowrite64-hel.patch [new file with mode: 0644]
target/linux/uml/patches-6.12/101-mconsole-exec.patch [new file with mode: 0644]
target/linux/uml/patches-6.12/102-pseudo-random-mac.patch [new file with mode: 0644]
target/linux/uml/patches-6.6/101-mconsole-exec.patch [deleted file]
target/linux/uml/patches-6.6/102-pseudo-random-mac.patch [deleted file]

index 00f19fce5bdd29323241fd9e0cce4f8e531507f1..d3f326297532718b63348608dfe4f05673f60602 100644 (file)
@@ -15,6 +15,7 @@ FEATURES:=audio ext4 rootfs-part squashfs
 SUBTARGETS:=generic
 
 KERNEL_PATCHVER:=6.6
+KERNEL_TESTING_PATCHVER:=6.12
 
 include $(INCLUDE_DIR)/target.mk
 
diff --git a/target/linux/uml/config-6.12 b/target/linux/uml/config-6.12
new file mode 100644 (file)
index 0000000..273c10e
--- /dev/null
@@ -0,0 +1,160 @@
+CONFIG_3_LEVEL_PGTABLES=y
+CONFIG_64BIT=y
+CONFIG_ARCH_DMA_ADDR_T_64BIT=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_BLK_DEV_COW_COMMON=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_UBD=y
+CONFIG_BLK_DEV_UBD_SYNC=y
+CONFIG_BLK_MQ_VIRTIO=y
+CONFIG_BUFFER_HEAD=y
+CONFIG_CDROM=y
+# CONFIG_COMMON_CLK is not set
+CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
+# CONFIG_COMPAT_32BIT_TIME is not set
+CONFIG_CON_CHAN="xterm"
+CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
+CONFIG_CPU_MITIGATIONS=y
+CONFIG_CPU_SUP_AMD=y
+CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_CPU_SUP_HYGON=y
+CONFIG_CPU_SUP_INTEL=y
+CONFIG_CPU_SUP_ZHAOXIN=y
+CONFIG_CRC16=y
+CONFIG_CRYPTO_CRC32=y
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
+CONFIG_CRYPTO_LIB_GF128MUL=y
+CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11
+CONFIG_CRYPTO_LIB_SHA1=y
+CONFIG_CRYPTO_LIB_UTILS=y
+CONFIG_CRYPTO_SHA1=y
+CONFIG_DCACHE_WORD_ACCESS=y
+# CONFIG_DEBUG_INFO is not set
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DNOTIFY=y
+# CONFIG_EARLY_PRINTK is not set
+CONFIG_EXCLUSIVE_SYSTEM_RAM=y
+CONFIG_EXT4_FS=y
+CONFIG_F2FS_FS=y
+CONFIG_FAILOVER=y
+CONFIG_FORCE_NR_CPUS=y
+CONFIG_FS_IOMAP=y
+CONFIG_FS_MBCACHE=y
+CONFIG_FUNCTION_ALIGNMENT=0
+CONFIG_FW_LOADER_PAGED_BUF=y
+CONFIG_FW_LOADER_SYSFS=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CPU=y
+CONFIG_GENERIC_CPU_DEVICES=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GPIO_CDEV=y
+CONFIG_HOSTFS=y
+CONFIG_HVC_DRIVER=y
+CONFIG_HW_RANDOM=y
+CONFIG_HZ_PERIODIC=y
+CONFIG_IA32_FEAT_CTL=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_INIT_ENV_ARG_LIMIT=128
+CONFIG_IRQ_WORK=y
+CONFIG_ISO9660_FS=y
+CONFIG_JBD2=y
+# CONFIG_JFFS2_FS is not set
+CONFIG_KALLSYMS=y
+CONFIG_KERNEL_STACK_ORDER=2
+CONFIG_LD_SCRIPT_DYN_RPATH=y
+CONFIG_LOCK_DEBUGGING_SUPPORT=y
+# CONFIG_MATOM is not set
+CONFIG_MAY_HAVE_RUNTIME_DEPS=y
+CONFIG_MCONSOLE=y
+# CONFIG_MCORE2 is not set
+CONFIG_MIGRATION=y
+# CONFIG_MK8 is not set
+# CONFIG_MMAPPER is not set
+CONFIG_MMU_LAZY_TLB_REFCOUNT=y
+CONFIG_MODULES_USE_ELF_RELA=y
+# CONFIG_MPSC is not set
+CONFIG_NAMESPACES=y
+CONFIG_NEED_PER_CPU_KM=y
+CONFIG_NET_EGRESS=y
+CONFIG_NET_FAILOVER=y
+CONFIG_NET_INGRESS=y
+# CONFIG_NET_NS is not set
+CONFIG_NET_XGRESS=y
+CONFIG_NLS=y
+CONFIG_NO_DMA=y
+CONFIG_NO_IOMEM=y
+CONFIG_NO_IOPORT_MAP=y
+CONFIG_NR_CPUS=1
+# CONFIG_NSM is not set
+CONFIG_NULL_CHAN=y
+# CONFIG_OF is not set
+CONFIG_PAGE_POOL=y
+CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
+CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
+CONFIG_PAHOLE_HAS_LANG_EXCLUDE=y
+CONFIG_PGTABLE_LEVELS=3
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_PORT_CHAN=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+# CONFIG_PROCESSOR_SELECT is not set
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_PTP_1588_CLOCK_OPTIONAL=y
+CONFIG_PTY_CHAN=y
+CONFIG_RANDSTRUCT_NONE=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_GZIP=y
+CONFIG_RELAY=y
+CONFIG_SG_POOL=y
+CONFIG_SOFT_WATCHDOG=m
+CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
+CONFIG_SSL=y
+CONFIG_SSL_CHAN="pty"
+CONFIG_STACKTRACE=y
+CONFIG_STDERR_CONSOLE=y
+CONFIG_TICK_CPU_ACCOUNTING=y
+CONFIG_TINY_SRCU=y
+CONFIG_TOOLS_SUPPORT_RELR=y
+CONFIG_TTY_CHAN=y
+CONFIG_UML=y
+CONFIG_UML_NET=y
+CONFIG_UML_NET_DAEMON=y
+CONFIG_UML_NET_DAEMON_DEFAULT_SOCK="/tmp/uml.ctl"
+CONFIG_UML_NET_DETERMINISTIC_MAC=y
+CONFIG_UML_NET_ETHERTAP=y
+CONFIG_UML_NET_MCAST=y
+CONFIG_UML_NET_SLIP=y
+CONFIG_UML_NET_SLIRP=y
+CONFIG_UML_NET_TUNTAP=y
+# CONFIG_UML_NET_VDE is not set
+CONFIG_UML_NET_VECTOR=y
+# CONFIG_UML_PCI_OVER_VIRTIO is not set
+CONFIG_UML_RANDOM=y
+CONFIG_UML_TIME_TRAVEL_SUPPORT=y
+# CONFIG_UML_WATCHDOG is not set
+CONFIG_UML_X86=y
+# CONFIG_USER_NS is not set
+CONFIG_VIRTIO=y
+CONFIG_VIRTIO_ANCHOR=y
+CONFIG_VIRTIO_BLK=y
+CONFIG_VIRTIO_CONSOLE=y
+# CONFIG_VIRTIO_DEBUG is not set
+CONFIG_VIRTIO_NET=y
+CONFIG_VIRTIO_UML=y
+CONFIG_VMAP_STACK=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_WATCHDOG_CORE=y
+CONFIG_X86_64=y
+CONFIG_X86_CMOV=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_HAVE_PAE=y
+CONFIG_X86_INTERNODE_CACHE_SHIFT=6
+CONFIG_X86_L1_CACHE_SHIFT=6
+CONFIG_X86_MINIMUM_CPU_FAMILY=64
+CONFIG_X86_TSC=y
+CONFIG_X86_VMX_FEATURE_NAMES=y
+CONFIG_XTERM_CHAN=y
+CONFIG_XTERM_CHAN_DEFAULT_EMULATOR="xterm"
+CONFIG_ZLIB_INFLATE=y
diff --git a/target/linux/uml/config-6.6 b/target/linux/uml/config-6.6
deleted file mode 100644 (file)
index 60d1ce0..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-CONFIG_3_LEVEL_PGTABLES=y
-CONFIG_64BIT=y
-CONFIG_ARCH_DMA_ADDR_T_64BIT=y
-CONFIG_ARCH_NO_PREEMPT=y
-CONFIG_ARCH_SUSPEND_POSSIBLE=y
-CONFIG_BLK_DEV_COW_COMMON=y
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_UBD=y
-CONFIG_BLK_DEV_UBD_SYNC=y
-CONFIG_BLK_MQ_VIRTIO=y
-CONFIG_BUFFER_HEAD=y
-CONFIG_CDROM=y
-# CONFIG_COMMON_CLK is not set
-CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
-# CONFIG_COMPAT_32BIT_TIME is not set
-CONFIG_CON_CHAN="xterm"
-CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
-CONFIG_CPU_SUP_AMD=y
-CONFIG_CPU_SUP_CENTAUR=y
-CONFIG_CPU_SUP_HYGON=y
-CONFIG_CPU_SUP_INTEL=y
-CONFIG_CPU_SUP_ZHAOXIN=y
-CONFIG_CRC16=y
-CONFIG_CRYPTO_CRC32=y
-CONFIG_CRYPTO_CRC32C=y
-CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
-CONFIG_CRYPTO_LIB_GF128MUL=y
-CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11
-CONFIG_CRYPTO_LIB_SHA1=y
-CONFIG_CRYPTO_LIB_UTILS=y
-CONFIG_CRYPTO_SHA1=y
-CONFIG_DCACHE_WORD_ACCESS=y
-CONFIG_DECOMPRESS_BZIP2=y
-CONFIG_DECOMPRESS_GZIP=y
-CONFIG_DNOTIFY=y
-# CONFIG_EARLY_PRINTK is not set
-CONFIG_EXCLUSIVE_SYSTEM_RAM=y
-CONFIG_EXT4_FS=y
-CONFIG_F2FS_FS=y
-CONFIG_FAILOVER=y
-CONFIG_FS_IOMAP=y
-CONFIG_FS_MBCACHE=y
-CONFIG_FUNCTION_ALIGNMENT=0
-CONFIG_FW_LOADER_PAGED_BUF=y
-CONFIG_FW_LOADER_SYSFS=y
-CONFIG_GENERIC_CLOCKEVENTS=y
-# CONFIG_GENERIC_CPU is not set
-CONFIG_GENERIC_CPU_DEVICES=y
-CONFIG_GENERIC_IRQ_SHOW=y
-CONFIG_GPIO_CDEV=y
-CONFIG_HOSTFS=y
-CONFIG_HVC_DRIVER=y
-CONFIG_HW_RANDOM=y
-CONFIG_HZ_PERIODIC=y
-CONFIG_IA32_FEAT_CTL=y
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_INIT_ENV_ARG_LIMIT=128
-CONFIG_IRQ_WORK=y
-CONFIG_ISO9660_FS=y
-CONFIG_JBD2=y
-# CONFIG_JFFS2_FS is not set
-CONFIG_KALLSYMS=y
-CONFIG_KERNEL_STACK_ORDER=2
-CONFIG_LOCK_DEBUGGING_SUPPORT=y
-# CONFIG_MATOM is not set
-CONFIG_MAY_HAVE_RUNTIME_DEPS=y
-CONFIG_MCONSOLE=y
-# CONFIG_MCORE2 is not set
-CONFIG_MIGRATION=y
-CONFIG_MK8=y
-# CONFIG_MMAPPER is not set
-CONFIG_MMU_LAZY_TLB_REFCOUNT=y
-CONFIG_MODULES_USE_ELF_RELA=y
-# CONFIG_MPSC is not set
-CONFIG_NAMESPACES=y
-CONFIG_NEED_PER_CPU_KM=y
-CONFIG_NET_EGRESS=y
-CONFIG_NET_FAILOVER=y
-CONFIG_NET_INGRESS=y
-# CONFIG_NET_NS is not set
-CONFIG_NET_XGRESS=y
-CONFIG_NLS=y
-CONFIG_NO_DMA=y
-CONFIG_NO_IOMEM=y
-CONFIG_NO_IOPORT_MAP=y
-CONFIG_NR_CPUS=1
-CONFIG_NULL_CHAN=y
-# CONFIG_OF is not set
-CONFIG_PAGE_POOL=y
-CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
-CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
-CONFIG_PAHOLE_HAS_LANG_EXCLUDE=y
-CONFIG_PGTABLE_LEVELS=3
-CONFIG_PHYS_ADDR_T_64BIT=y
-CONFIG_PORT_CHAN=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_POSIX_MQUEUE_SYSCTL=y
-CONFIG_PREEMPT_NONE_BUILD=y
-# CONFIG_PROCESSOR_SELECT is not set
-CONFIG_PROC_PAGE_MONITOR=y
-CONFIG_PTP_1588_CLOCK_OPTIONAL=y
-CONFIG_PTY_CHAN=y
-CONFIG_RANDSTRUCT_NONE=y
-CONFIG_RD_BZIP2=y
-CONFIG_RD_GZIP=y
-CONFIG_RELAY=y
-CONFIG_SG_POOL=y
-CONFIG_SOFT_WATCHDOG=m
-CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
-CONFIG_SSL=y
-CONFIG_SSL_CHAN="pty"
-CONFIG_STACKTRACE=y
-CONFIG_STDERR_CONSOLE=y
-CONFIG_TICK_CPU_ACCOUNTING=y
-CONFIG_TINY_SRCU=y
-CONFIG_TOOLS_SUPPORT_RELR=y
-CONFIG_TTY_CHAN=y
-CONFIG_UML=y
-CONFIG_UML_NET=y
-CONFIG_UML_NET_DAEMON=y
-CONFIG_UML_NET_DAEMON_DEFAULT_SOCK="/tmp/uml.ctl"
-CONFIG_UML_NET_DETERMINISTIC_MAC=y
-CONFIG_UML_NET_ETHERTAP=y
-CONFIG_UML_NET_MCAST=y
-# CONFIG_UML_NET_PCAP is not set
-CONFIG_UML_NET_SLIP=y
-CONFIG_UML_NET_SLIRP=y
-CONFIG_UML_NET_TUNTAP=y
-# CONFIG_UML_NET_VDE is not set
-CONFIG_UML_NET_VECTOR=y
-# CONFIG_UML_PCI_OVER_VIRTIO is not set
-CONFIG_UML_RANDOM=y
-CONFIG_UML_TIME_TRAVEL_SUPPORT=y
-# CONFIG_UML_WATCHDOG is not set
-CONFIG_UML_X86=y
-# CONFIG_USER_NS is not set
-CONFIG_VIRTIO=y
-CONFIG_VIRTIO_ANCHOR=y
-CONFIG_VIRTIO_BLK=y
-CONFIG_VIRTIO_CONSOLE=y
-CONFIG_VIRTIO_NET=y
-CONFIG_VIRTIO_UML=y
-CONFIG_VMAP_STACK=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_WATCHDOG_CORE=y
-CONFIG_X86_64=y
-CONFIG_X86_CMOV=y
-CONFIG_X86_CMPXCHG64=y
-CONFIG_X86_INTEL_USERCOPY=y
-CONFIG_X86_INTERNODE_CACHE_SHIFT=6
-CONFIG_X86_L1_CACHE_SHIFT=6
-CONFIG_X86_MINIMUM_CPU_FAMILY=64
-CONFIG_X86_TSC=y
-CONFIG_X86_USE_PPRO_CHECKSUM=y
-CONFIG_X86_VMX_FEATURE_NAMES=y
-CONFIG_XTERM_CHAN=y
-CONFIG_XTERM_CHAN_DEFAULT_EMULATOR="xterm"
-CONFIG_ZLIB_INFLATE=y
diff --git a/target/linux/uml/patches-6.12/000-v6.13-asm-generic-io.h-rework-split-ioread64-iowrite64-hel.patch b/target/linux/uml/patches-6.12/000-v6.13-asm-generic-io.h-rework-split-ioread64-iowrite64-hel.patch
new file mode 100644 (file)
index 0000000..f4092aa
--- /dev/null
@@ -0,0 +1,301 @@
+From dc90c890363d3e4b0ec73cd21b5be592692723fd Mon Sep 17 00:00:00 2001
+From: Arnd Bergmann <[email protected]>
+Date: Mon, 3 Feb 2025 15:07:30 +0100
+Subject: [PATCH] asm-generic/io.h: rework split ioread64/iowrite64 helpers
+
+There are two incompatible sets of definitions of these eight functions:
+On 64-bit architectures setting CONFIG_HAS_IOPORT, they turn into
+either pair of 32-bit PIO (inl/outl) accesses or a single 64-bit MMIO
+(readq/writeq). On other 64-bit architectures, they are always split
+into 32-bit accesses.
+
+Depending on which header gets included in a driver, there are
+additionally definitions for ioread64()/iowrite64() that are
+expected to produce a 64-bit register MMIO access on all 64-bit
+architectures.
+
+To separate the conflicting definitions, make the version in
+include/linux/io-64-nonatomic-*.h visible on all architectures
+but pick the one from lib/iomap.c on architectures that set
+CONFIG_GENERIC_IOMAP in place of the default fallback.
+
+Acked-by: Andy Shevchenko <[email protected]>
+Signed-off-by: Arnd Bergmann <[email protected]>
+---
+ include/asm-generic/iomap.h           | 36 ++++++------------------
+ include/linux/io-64-nonatomic-hi-lo.h | 16 +++++++++++
+ include/linux/io-64-nonatomic-lo-hi.h | 16 +++++++++++
+ lib/iomap.c                           | 40 +++++++++++++--------------
+ 4 files changed, 60 insertions(+), 48 deletions(-)
+
+diff --git a/include/asm-generic/iomap.h b/include/asm-generic/iomap.h
+index 196087a8126e..9f3f25d7fc58 100644
+--- a/include/asm-generic/iomap.h
++++ b/include/asm-generic/iomap.h
+@@ -31,42 +31,22 @@ extern unsigned int ioread16(const void __iomem *);
+ extern unsigned int ioread16be(const void __iomem *);
+ extern unsigned int ioread32(const void __iomem *);
+ extern unsigned int ioread32be(const void __iomem *);
+-#ifdef CONFIG_64BIT
+-extern u64 ioread64(const void __iomem *);
+-extern u64 ioread64be(const void __iomem *);
+-#endif
+-#ifdef readq
+-#define ioread64_lo_hi ioread64_lo_hi
+-#define ioread64_hi_lo ioread64_hi_lo
+-#define ioread64be_lo_hi ioread64be_lo_hi
+-#define ioread64be_hi_lo ioread64be_hi_lo
+-extern u64 ioread64_lo_hi(const void __iomem *addr);
+-extern u64 ioread64_hi_lo(const void __iomem *addr);
+-extern u64 ioread64be_lo_hi(const void __iomem *addr);
+-extern u64 ioread64be_hi_lo(const void __iomem *addr);
+-#endif
++extern u64 __ioread64_lo_hi(const void __iomem *addr);
++extern u64 __ioread64_hi_lo(const void __iomem *addr);
++extern u64 __ioread64be_lo_hi(const void __iomem *addr);
++extern u64 __ioread64be_hi_lo(const void __iomem *addr);
+ extern void iowrite8(u8, void __iomem *);
+ extern void iowrite16(u16, void __iomem *);
+ extern void iowrite16be(u16, void __iomem *);
+ extern void iowrite32(u32, void __iomem *);
+ extern void iowrite32be(u32, void __iomem *);
+-#ifdef CONFIG_64BIT
+-extern void iowrite64(u64, void __iomem *);
+-extern void iowrite64be(u64, void __iomem *);
+-#endif
+-#ifdef writeq
+-#define iowrite64_lo_hi iowrite64_lo_hi
+-#define iowrite64_hi_lo iowrite64_hi_lo
+-#define iowrite64be_lo_hi iowrite64be_lo_hi
+-#define iowrite64be_hi_lo iowrite64be_hi_lo
+-extern void iowrite64_lo_hi(u64 val, void __iomem *addr);
+-extern void iowrite64_hi_lo(u64 val, void __iomem *addr);
+-extern void iowrite64be_lo_hi(u64 val, void __iomem *addr);
+-extern void iowrite64be_hi_lo(u64 val, void __iomem *addr);
+-#endif
++extern void __iowrite64_lo_hi(u64 val, void __iomem *addr);
++extern void __iowrite64_hi_lo(u64 val, void __iomem *addr);
++extern void __iowrite64be_lo_hi(u64 val, void __iomem *addr);
++extern void __iowrite64be_hi_lo(u64 val, void __iomem *addr);
+ /*
+  * "string" versions of the above. Note that they
+diff --git a/include/linux/io-64-nonatomic-hi-lo.h b/include/linux/io-64-nonatomic-hi-lo.h
+index f32522bb3aa5..d3eade7cf663 100644
+--- a/include/linux/io-64-nonatomic-hi-lo.h
++++ b/include/linux/io-64-nonatomic-hi-lo.h
+@@ -101,22 +101,38 @@ static inline void iowrite64be_hi_lo(u64 val, void __iomem *addr)
+ #ifndef ioread64
+ #define ioread64_is_nonatomic
++#if defined(CONFIG_GENERIC_IOMAP) && defined(CONFIG_64BIT)
++#define ioread64 __ioread64_hi_lo
++#else
+ #define ioread64 ioread64_hi_lo
+ #endif
++#endif
+ #ifndef iowrite64
+ #define iowrite64_is_nonatomic
++#if defined(CONFIG_GENERIC_IOMAP) && defined(CONFIG_64BIT)
++#define iowrite64 __iowrite64_hi_lo
++#else
+ #define iowrite64 iowrite64_hi_lo
+ #endif
++#endif
+ #ifndef ioread64be
+ #define ioread64be_is_nonatomic
++#if defined(CONFIG_GENERIC_IOMAP) && defined(CONFIG_64BIT)
++#define ioread64be __ioread64be_hi_lo
++#else
+ #define ioread64be ioread64be_hi_lo
+ #endif
++#endif
+ #ifndef iowrite64be
+ #define iowrite64be_is_nonatomic
++#if defined(CONFIG_GENERIC_IOMAP) && defined(CONFIG_64BIT)
++#define iowrite64be __iowrite64be_hi_lo
++#else
+ #define iowrite64be iowrite64be_hi_lo
+ #endif
++#endif
+ #endif        /* _LINUX_IO_64_NONATOMIC_HI_LO_H_ */
+diff --git a/include/linux/io-64-nonatomic-lo-hi.h b/include/linux/io-64-nonatomic-lo-hi.h
+index 448a21435dba..94e676ec3d3f 100644
+--- a/include/linux/io-64-nonatomic-lo-hi.h
++++ b/include/linux/io-64-nonatomic-lo-hi.h
+@@ -101,22 +101,38 @@ static inline void iowrite64be_lo_hi(u64 val, void __iomem *addr)
+ #ifndef ioread64
+ #define ioread64_is_nonatomic
++#if defined(CONFIG_GENERIC_IOMAP) && defined(CONFIG_64BIT)
++#define ioread64 __ioread64_lo_hi
++#else
+ #define ioread64 ioread64_lo_hi
+ #endif
++#endif
+ #ifndef iowrite64
+ #define iowrite64_is_nonatomic
++#if defined(CONFIG_GENERIC_IOMAP) && defined(CONFIG_64BIT)
++#define iowrite64 __iowrite64_lo_hi
++#else
+ #define iowrite64 iowrite64_lo_hi
+ #endif
++#endif
+ #ifndef ioread64be
+ #define ioread64be_is_nonatomic
++#if defined(CONFIG_GENERIC_IOMAP) && defined(CONFIG_64BIT)
++#define ioread64be __ioread64be_lo_hi
++#else
+ #define ioread64be ioread64be_lo_hi
+ #endif
++#endif
+ #ifndef iowrite64be
+ #define iowrite64be_is_nonatomic
++#if defined(CONFIG_GENERIC_IOMAP) && defined(CONFIG_64BIT)
++#define iowrite64be __iowrite64be_lo_hi
++#else
+ #define iowrite64be iowrite64be_lo_hi
+ #endif
++#endif
+ #endif        /* _LINUX_IO_64_NONATOMIC_LO_HI_H_ */
+diff --git a/lib/iomap.c b/lib/iomap.c
+index 4f8b31baa575..a65717cd86f7 100644
+--- a/lib/iomap.c
++++ b/lib/iomap.c
+@@ -111,7 +111,7 @@ EXPORT_SYMBOL(ioread16be);
+ EXPORT_SYMBOL(ioread32);
+ EXPORT_SYMBOL(ioread32be);
+-#ifdef readq
++#ifdef CONFIG_64BIT
+ static u64 pio_read64_lo_hi(unsigned long port)
+ {
+       u64 lo, hi;
+@@ -153,21 +153,21 @@ static u64 pio_read64be_hi_lo(unsigned long port)
+ }
+ __no_kmsan_checks
+-u64 ioread64_lo_hi(const void __iomem *addr)
++u64 __ioread64_lo_hi(const void __iomem *addr)
+ {
+       IO_COND(addr, return pio_read64_lo_hi(port), return readq(addr));
+       return 0xffffffffffffffffULL;
+ }
+ __no_kmsan_checks
+-u64 ioread64_hi_lo(const void __iomem *addr)
++u64 __ioread64_hi_lo(const void __iomem *addr)
+ {
+       IO_COND(addr, return pio_read64_hi_lo(port), return readq(addr));
+       return 0xffffffffffffffffULL;
+ }
+ __no_kmsan_checks
+-u64 ioread64be_lo_hi(const void __iomem *addr)
++u64 __ioread64be_lo_hi(const void __iomem *addr)
+ {
+       IO_COND(addr, return pio_read64be_lo_hi(port),
+               return mmio_read64be(addr));
+@@ -175,19 +175,19 @@ u64 ioread64be_lo_hi(const void __iomem *addr)
+ }
+ __no_kmsan_checks
+-u64 ioread64be_hi_lo(const void __iomem *addr)
++u64 __ioread64be_hi_lo(const void __iomem *addr)
+ {
+       IO_COND(addr, return pio_read64be_hi_lo(port),
+               return mmio_read64be(addr));
+       return 0xffffffffffffffffULL;
+ }
+-EXPORT_SYMBOL(ioread64_lo_hi);
+-EXPORT_SYMBOL(ioread64_hi_lo);
+-EXPORT_SYMBOL(ioread64be_lo_hi);
+-EXPORT_SYMBOL(ioread64be_hi_lo);
++EXPORT_SYMBOL(__ioread64_lo_hi);
++EXPORT_SYMBOL(__ioread64_hi_lo);
++EXPORT_SYMBOL(__ioread64be_lo_hi);
++EXPORT_SYMBOL(__ioread64be_hi_lo);
+-#endif /* readq */
++#endif /* CONFIG_64BIT */
+ #ifndef pio_write16be
+ #define pio_write16be(val,port) outw(swab16(val),port)
+@@ -236,7 +236,7 @@ EXPORT_SYMBOL(iowrite16be);
+ EXPORT_SYMBOL(iowrite32);
+ EXPORT_SYMBOL(iowrite32be);
+-#ifdef writeq
++#ifdef CONFIG_64BIT
+ static void pio_write64_lo_hi(u64 val, unsigned long port)
+ {
+       outl(val, port);
+@@ -261,7 +261,7 @@ static void pio_write64be_hi_lo(u64 val, unsigned long port)
+       pio_write32be(val, port + sizeof(u32));
+ }
+-void iowrite64_lo_hi(u64 val, void __iomem *addr)
++void __iowrite64_lo_hi(u64 val, void __iomem *addr)
+ {
+       /* Make sure uninitialized memory isn't copied to devices. */
+       kmsan_check_memory(&val, sizeof(val));
+@@ -269,7 +269,7 @@ void iowrite64_lo_hi(u64 val, void __iomem *addr)
+               writeq(val, addr));
+ }
+-void iowrite64_hi_lo(u64 val, void __iomem *addr)
++void __iowrite64_hi_lo(u64 val, void __iomem *addr)
+ {
+       /* Make sure uninitialized memory isn't copied to devices. */
+       kmsan_check_memory(&val, sizeof(val));
+@@ -277,7 +277,7 @@ void iowrite64_hi_lo(u64 val, void __iomem *addr)
+               writeq(val, addr));
+ }
+-void iowrite64be_lo_hi(u64 val, void __iomem *addr)
++void __iowrite64be_lo_hi(u64 val, void __iomem *addr)
+ {
+       /* Make sure uninitialized memory isn't copied to devices. */
+       kmsan_check_memory(&val, sizeof(val));
+@@ -285,7 +285,7 @@ void iowrite64be_lo_hi(u64 val, void __iomem *addr)
+               mmio_write64be(val, addr));
+ }
+-void iowrite64be_hi_lo(u64 val, void __iomem *addr)
++void __iowrite64be_hi_lo(u64 val, void __iomem *addr)
+ {
+       /* Make sure uninitialized memory isn't copied to devices. */
+       kmsan_check_memory(&val, sizeof(val));
+@@ -293,12 +293,12 @@ void iowrite64be_hi_lo(u64 val, void __iomem *addr)
+               mmio_write64be(val, addr));
+ }
+-EXPORT_SYMBOL(iowrite64_lo_hi);
+-EXPORT_SYMBOL(iowrite64_hi_lo);
+-EXPORT_SYMBOL(iowrite64be_lo_hi);
+-EXPORT_SYMBOL(iowrite64be_hi_lo);
++EXPORT_SYMBOL(__iowrite64_lo_hi);
++EXPORT_SYMBOL(__iowrite64_hi_lo);
++EXPORT_SYMBOL(__iowrite64be_lo_hi);
++EXPORT_SYMBOL(__iowrite64be_hi_lo);
+-#endif /* readq */
++#endif /* CONFIG_64BIT */
+ /*
+  * These are the "repeat MMIO read/write" functions.
+-- 
+2.49.0
+
diff --git a/target/linux/uml/patches-6.12/101-mconsole-exec.patch b/target/linux/uml/patches-6.12/101-mconsole-exec.patch
new file mode 100644 (file)
index 0000000..9ba4523
--- /dev/null
@@ -0,0 +1,213 @@
+#
+# Minimalist mconsole exec patch 
+#
+# 3.10 version (with bit more synchronous behavior) by fingon at iki dot fi
+# Adaptation to kernel 3.3.8 made by David Fernández (david at dit.upm.es) for 
+# Starting point: mconsole-exec-2.6.30.patch for kernel 2.6.30
+# Author of original patch: Paolo Giarrusso, aka Blaisorblade 
+#                           (http://www.user-mode-linux.org/~blaisorblade)
+#
+# Known misfeatures:
+#
+# - If output is too long, blocks (and breaks horribly) 
+# (this misfeature from 3.10 patches, when minimalizing the patch;
+#  workaround: redirect to a shared filesystem if long output is expected)
+#
+# - Nothing useful is done with stdin
+#
+--- a/arch/um/drivers/mconsole.h
++++ b/arch/um/drivers/mconsole.h
+@@ -85,6 +85,7 @@ extern void mconsole_cad(struct mc_reque
+ extern void mconsole_stop(struct mc_request *req);
+ extern void mconsole_go(struct mc_request *req);
+ extern void mconsole_log(struct mc_request *req);
++extern void mconsole_exec(struct mc_request *req);
+ extern void mconsole_proc(struct mc_request *req);
+ extern void mconsole_stack(struct mc_request *req);
+--- a/arch/um/drivers/mconsole_kern.c
++++ b/arch/um/drivers/mconsole_kern.c
+@@ -4,6 +4,7 @@
+  * Copyright (C) 2001 - 2008 Jeff Dike (jdike@{addtoit,linux.intel}.com)
+  */
++#include <linux/kmod.h>
+ #include <linux/console.h>
+ #include <linux/ctype.h>
+ #include <linux/string.h>
+@@ -27,6 +28,7 @@
+ #include <linux/mount.h>
+ #include <linux/file.h>
+ #include <linux/uaccess.h>
++#include <linux/completion.h>
+ #include <asm/switch_to.h>
+ #include <init.h>
+@@ -124,6 +126,59 @@ void mconsole_log(struct mc_request *req
+       mconsole_reply(req, "", 0, 0);
+ }
++void mconsole_exec(struct mc_request *req)
++{
++  struct subprocess_info *sub_info;
++  int res, len;
++  struct file *out;
++  char buf[MCONSOLE_MAX_DATA];
++
++  char *envp[] = {
++    "HOME=/", "TERM=linux",
++    "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin",
++    NULL
++  };
++  char *argv[] = {
++    "/bin/sh", "-c",
++    req->request.data + strlen("exec "),
++    NULL
++  };
++
++  sub_info = call_usermodehelper_setup("/bin/sh", argv, envp, GFP_ATOMIC, NULL, NULL, NULL);
++  if (sub_info == NULL) {
++    mconsole_reply(req, "call_usermodehelper_setup failed", 1, 0);
++    return;
++  }
++  res = call_usermodehelper_stdoutpipe(sub_info, &out);
++  if (res < 0) {
++    kfree(sub_info);
++    mconsole_reply(req, "call_usermodehelper_stdoutpipe failed", 1, 0);
++    return;
++  }
++
++  res = call_usermodehelper_exec(sub_info, UMH_WAIT_PROC);
++  if (res < 0) {
++    kfree(sub_info);
++    mconsole_reply(req, "call_usermodehelper_exec failed", 1, 0);
++    return;
++  }
++
++  for (;;) {
++    len = out->f_op->read(out, buf, sizeof(buf), &out->f_pos);
++    if (len < 0) {
++      mconsole_reply(req, "reading output failed", 1, 0);
++      break;
++    }
++    if (len == 0)
++      break;
++    mconsole_reply_len(req, buf, len, 0, 1);
++  }
++  fput(out);
++
++  mconsole_reply_len(req, NULL, 0, 0, 0);
++}
++
++
+ void mconsole_proc(struct mc_request *req)
+ {
+       struct vfsmount *mnt = proc_mnt;
+@@ -190,6 +245,7 @@ void mconsole_proc(struct mc_request *re
+     stop - pause the UML; it will do nothing until it receives a 'go' \n\
+     go - continue the UML after a 'stop' \n\
+     log <string> - make UML enter <string> into the kernel log\n\
++    exec <string> - pass <string> to /bin/sh -c synchronously\n\
+     proc <file> - returns the contents of the UML's /proc/<file>\n\
+     stack <pid> - returns the stack of the specified pid\n\
+ "
+--- a/arch/um/drivers/mconsole_user.c
++++ b/arch/um/drivers/mconsole_user.c
+@@ -30,6 +30,7 @@ static struct mconsole_command commands[
+       { "stop", mconsole_stop, MCONSOLE_PROC },
+       { "go", mconsole_go, MCONSOLE_INTR },
+       { "log", mconsole_log, MCONSOLE_INTR },
++      { "exec", mconsole_exec, MCONSOLE_PROC },
+       { "proc", mconsole_proc, MCONSOLE_PROC },
+       { "stack", mconsole_stack, MCONSOLE_INTR },
+ };
+--- a/arch/um/os-Linux/file.c
++++ b/arch/um/os-Linux/file.c
+@@ -578,6 +578,8 @@ int os_create_unix_socket(const char *fi
+       addr.sun_family = AF_UNIX;
++      if (len > sizeof(addr.sun_path))
++              len = sizeof(addr.sun_path);
+       snprintf(addr.sun_path, len, "%s", file);
+       err = bind(sock, (struct sockaddr *) &addr, sizeof(addr));
+--- a/include/linux/kmod.h
++++ b/include/linux/kmod.h
+@@ -32,4 +32,6 @@ static inline int request_module_nowait(
+ #define try_then_request_module(x, mod...) (x)
+ #endif
++int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info, struct file **filp);
++
+ #endif /* __LINUX_KMOD_H__ */
+--- a/include/linux/umh.h
++++ b/include/linux/umh.h
+@@ -23,6 +23,7 @@ struct subprocess_info {
+       const char *path;
+       char **argv;
+       char **envp;
++      struct file *stdout;
+       int wait;
+       int retval;
+       int (*init)(struct subprocess_info *info, struct cred *new);
+--- a/kernel/umh.c
++++ b/kernel/umh.c
+@@ -29,6 +29,7 @@
+ #include <linux/uaccess.h>
+ #include <linux/initrd.h>
+ #include <linux/freezer.h>
++#include <linux/pipe_fs_i.h>
+ #include <trace/events/module.h>
+@@ -71,6 +72,28 @@ static int call_usermodehelper_exec_asyn
+       flush_signal_handlers(current, 1);
+       spin_unlock_irq(&current->sighand->siglock);
++      /* Install output when needed */
++      if (sub_info->stdout) {
++              struct files_struct *f = current->files;
++              struct fdtable *fdt;
++
++              sys_close(1);
++              sys_close(2);
++              get_file(sub_info->stdout);
++              fd_install(1, sub_info->stdout);
++              fd_install(2, sub_info->stdout);
++              spin_lock(&f->file_lock);
++              fdt = files_fdtable(f);
++              __set_bit(1, fdt->open_fds);
++              __clear_bit(1, fdt->close_on_exec);
++              __set_bit(2, fdt->open_fds);
++              __clear_bit(2, fdt->close_on_exec);
++              spin_unlock(&f->file_lock);
++
++              /* disallow core files */
++              current->signal->rlim[RLIMIT_CORE] = (struct rlimit){0, 0};
++      }
++
+       /*
+        * Initial kernel threads share ther FS with init, in order to
+        * get the init root directory. But we've now created a new
+@@ -330,6 +353,20 @@ static void helper_unlock(void)
+               wake_up(&running_helpers_waitq);
+ }
++int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info,
++                                      struct file **filp)
++{
++      struct file *f[2];
++
++      if (create_pipe_files(f, 0) < 0)
++               return PTR_ERR(f);
++
++      sub_info->stdout = f[1];
++      *filp = f[0];
++      return 0;
++}
++EXPORT_SYMBOL(call_usermodehelper_stdoutpipe);
++
+ /**
+  * call_usermodehelper_setup - prepare to call a usermode helper
+  * @path: path to usermode executable
diff --git a/target/linux/uml/patches-6.12/102-pseudo-random-mac.patch b/target/linux/uml/patches-6.12/102-pseudo-random-mac.patch
new file mode 100644 (file)
index 0000000..2b42459
--- /dev/null
@@ -0,0 +1,151 @@
+===============================================================================
+
+This patch makes MAC addresses of network interfaces predictable. In
+particular, it adds a small routine that computes MAC addresses of based on
+a SHA1 hash of the virtual machine name and interface ID.
+
+TECHNICAL INFORMATION:
+
+Applies to vanilla kernel 3.9.4.
+
+===============================================================================
+--- a/arch/um/drivers/Kconfig
++++ b/arch/um/drivers/Kconfig
+@@ -143,6 +143,20 @@ config UML_NET
+         enable at least one of the following transport options to actually
+         make use of UML networking.
++config UML_NET_DETERMINISTIC_MAC
++      bool "Use deterministic MAC addresses for network interfaces"
++      default y
++      depends on UML_NET
++      select CRYPTO_SHA1
++      help
++        Virtual network devices inside a User-Mode Linux instance must be
++        assigned a MAC (Ethernet) address. If none is specified on the UML
++        command line, one must be automatically computed. If this option is
++        enabled, a randomly generated address is used. Otherwise, if this
++        option is disabled, the address is generated from a SHA1 hash of
++        the umid of the UML instance and the interface name. The latter choice
++        is useful to make MAC addresses predictable.
++
+ config UML_NET_ETHERTAP
+       bool "Ethertap transport (obsolete)"
+       depends on UML_NET
+--- a/arch/um/drivers/net_kern.c
++++ b/arch/um/drivers/net_kern.c
+@@ -25,6 +25,14 @@
+ #include <net_kern.h>
+ #include <net_user.h>
++#include <crypto/sha1.h>
++#include <crypto/hash.h>
++#include <linux/string.h>
++#include <linux/crypto.h>
++#include <linux/err.h>
++#include <linux/scatterlist.h>
++#include "os.h"
++
+ #define DRIVER_NAME "uml-netdev"
+ static DEFINE_SPINLOCK(opened_lock);
+@@ -274,9 +282,55 @@ static const struct ethtool_ops uml_net_
+       .get_ts_info    = ethtool_op_get_ts_info,
+ };
++#ifdef CONFIG_UML_NET_DETERMINISTIC_MAC
++
++/* Compute a SHA1 hash of the UML instance's id and
++ *  * an interface name. */
++static int compute_hash(const char *umid, const char *ifname, char *hash)
++{
++      struct ahash_request *desc = NULL;
++      struct crypto_ahash *tfm = NULL;
++      struct scatterlist sg;
++      char *vmif = NULL;
++      int ret = -ENOMEM;
++
++      vmif = kmalloc(1024, GFP_KERNEL);
++      if (!vmif)
++              goto out;
++
++      strcpy (vmif, umid);
++      strcat (vmif, ifname);
++
++      tfm = crypto_alloc_ahash("sha1", 0, CRYPTO_ALG_ASYNC);
++      if (IS_ERR(tfm))
++              goto out;
++
++      desc = ahash_request_alloc(tfm, GFP_KERNEL);
++      if (!desc)
++              goto out;
++
++      crypto_ahash_clear_flags(tfm, ~0);
++
++      sg_init_table(&sg, 1);
++      sg_set_buf(&sg, vmif, strlen(vmif));
++
++      ahash_request_set_crypt(desc, &sg, hash, strlen(vmif));
++
++      ret = crypto_ahash_digest(desc);
++out:
++      crypto_free_ahash(tfm);
++      ahash_request_free(desc);
++      kfree(vmif);
++
++      return ret;
++}
++
++#endif
++
+ void uml_net_setup_etheraddr(struct net_device *dev, char *str)
+ {
+       u8 addr[ETH_ALEN];
++      u8 hash[SHA1_DIGEST_SIZE];
+       char *end;
+       int i;
+@@ -320,9 +374,26 @@ void uml_net_setup_etheraddr(struct net_
+       return;
+ random:
++#ifndef CONFIG_UML_NET_DETERMINISTIC_MAC
+       printk(KERN_INFO
+              "Choosing a random ethernet address for device %s\n", dev->name);
+       eth_hw_addr_random(dev);
++#else
++      printk(KERN_INFO
++             "Computing a digest to use as ethernet address for device %s\n", dev->name);
++      if (compute_hash(get_umid(), dev->name, hash) < 0) {
++              printk(KERN_WARNING
++                     "Could not compute digest to use as ethernet address for device %s. "
++                     "Using random address instead.\n", dev->name);
++              eth_random_addr(addr);
++      }
++      else {
++              for (i=0; i < 6; i++)
++                      addr[i] = (hash[i] + hash[i+6]) % 0x100;
++      }
++      addr [0] &= 0xfe; /* clear multicast bit */
++      addr [0] |= 0x02; /* set local assignment bit (IEEE802) */
++#endif
+ }
+ static DEFINE_SPINLOCK(devices_lock);
+--- a/kernel/umh.c
++++ b/kernel/umh.c
+@@ -354,12 +354,12 @@ static void helper_unlock(void)
+ }
+ int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info,
+-                                      struct file **filp)
++                                 struct file **filp)
+ {
+       struct file *f[2];
+       if (create_pipe_files(f, 0) < 0)
+-               return PTR_ERR(f);
++              return PTR_ERR(f);
+       sub_info->stdout = f[1];
+       *filp = f[0];
diff --git a/target/linux/uml/patches-6.6/101-mconsole-exec.patch b/target/linux/uml/patches-6.6/101-mconsole-exec.patch
deleted file mode 100644 (file)
index 0afd777..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-#
-# Minimalist mconsole exec patch 
-#
-# 3.10 version (with bit more synchronous behavior) by fingon at iki dot fi
-# Adaptation to kernel 3.3.8 made by David Fernández (david at dit.upm.es) for 
-# Starting point: mconsole-exec-2.6.30.patch for kernel 2.6.30
-# Author of original patch: Paolo Giarrusso, aka Blaisorblade 
-#                           (http://www.user-mode-linux.org/~blaisorblade)
-#
-# Known misfeatures:
-#
-# - If output is too long, blocks (and breaks horribly) 
-# (this misfeature from 3.10 patches, when minimalizing the patch;
-#  workaround: redirect to a shared filesystem if long output is expected)
-#
-# - Nothing useful is done with stdin
-#
---- a/arch/um/drivers/mconsole.h
-+++ b/arch/um/drivers/mconsole.h
-@@ -85,6 +85,7 @@ extern void mconsole_cad(struct mc_reque
- extern void mconsole_stop(struct mc_request *req);
- extern void mconsole_go(struct mc_request *req);
- extern void mconsole_log(struct mc_request *req);
-+extern void mconsole_exec(struct mc_request *req);
- extern void mconsole_proc(struct mc_request *req);
- extern void mconsole_stack(struct mc_request *req);
---- a/arch/um/drivers/mconsole_kern.c
-+++ b/arch/um/drivers/mconsole_kern.c
-@@ -4,6 +4,7 @@
-  * Copyright (C) 2001 - 2008 Jeff Dike (jdike@{addtoit,linux.intel}.com)
-  */
-+#include <linux/kmod.h>
- #include <linux/console.h>
- #include <linux/ctype.h>
- #include <linux/string.h>
-@@ -27,6 +28,7 @@
- #include <linux/mount.h>
- #include <linux/file.h>
- #include <linux/uaccess.h>
-+#include <linux/completion.h>
- #include <asm/switch_to.h>
- #include <init.h>
-@@ -124,6 +126,59 @@ void mconsole_log(struct mc_request *req
-       mconsole_reply(req, "", 0, 0);
- }
-+void mconsole_exec(struct mc_request *req)
-+{
-+  struct subprocess_info *sub_info;
-+  int res, len;
-+  struct file *out;
-+  char buf[MCONSOLE_MAX_DATA];
-+
-+  char *envp[] = {
-+    "HOME=/", "TERM=linux",
-+    "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin",
-+    NULL
-+  };
-+  char *argv[] = {
-+    "/bin/sh", "-c",
-+    req->request.data + strlen("exec "),
-+    NULL
-+  };
-+
-+  sub_info = call_usermodehelper_setup("/bin/sh", argv, envp, GFP_ATOMIC, NULL, NULL, NULL);
-+  if (sub_info == NULL) {
-+    mconsole_reply(req, "call_usermodehelper_setup failed", 1, 0);
-+    return;
-+  }
-+  res = call_usermodehelper_stdoutpipe(sub_info, &out);
-+  if (res < 0) {
-+    kfree(sub_info);
-+    mconsole_reply(req, "call_usermodehelper_stdoutpipe failed", 1, 0);
-+    return;
-+  }
-+
-+  res = call_usermodehelper_exec(sub_info, UMH_WAIT_PROC);
-+  if (res < 0) {
-+    kfree(sub_info);
-+    mconsole_reply(req, "call_usermodehelper_exec failed", 1, 0);
-+    return;
-+  }
-+
-+  for (;;) {
-+    len = out->f_op->read(out, buf, sizeof(buf), &out->f_pos);
-+    if (len < 0) {
-+      mconsole_reply(req, "reading output failed", 1, 0);
-+      break;
-+    }
-+    if (len == 0)
-+      break;
-+    mconsole_reply_len(req, buf, len, 0, 1);
-+  }
-+  fput(out);
-+
-+  mconsole_reply_len(req, NULL, 0, 0, 0);
-+}
-+
-+
- void mconsole_proc(struct mc_request *req)
- {
-       struct vfsmount *mnt = proc_mnt;
-@@ -190,6 +245,7 @@ void mconsole_proc(struct mc_request *re
-     stop - pause the UML; it will do nothing until it receives a 'go' \n\
-     go - continue the UML after a 'stop' \n\
-     log <string> - make UML enter <string> into the kernel log\n\
-+    exec <string> - pass <string> to /bin/sh -c synchronously\n\
-     proc <file> - returns the contents of the UML's /proc/<file>\n\
-     stack <pid> - returns the stack of the specified pid\n\
- "
---- a/arch/um/drivers/mconsole_user.c
-+++ b/arch/um/drivers/mconsole_user.c
-@@ -30,6 +30,7 @@ static struct mconsole_command commands[
-       { "stop", mconsole_stop, MCONSOLE_PROC },
-       { "go", mconsole_go, MCONSOLE_INTR },
-       { "log", mconsole_log, MCONSOLE_INTR },
-+      { "exec", mconsole_exec, MCONSOLE_PROC },
-       { "proc", mconsole_proc, MCONSOLE_PROC },
-       { "stack", mconsole_stack, MCONSOLE_INTR },
- };
---- a/arch/um/os-Linux/file.c
-+++ b/arch/um/os-Linux/file.c
-@@ -560,6 +560,8 @@ int os_create_unix_socket(const char *fi
-       addr.sun_family = AF_UNIX;
-+      if (len > sizeof(addr.sun_path))
-+              len = sizeof(addr.sun_path);
-       snprintf(addr.sun_path, len, "%s", file);
-       err = bind(sock, (struct sockaddr *) &addr, sizeof(addr));
---- a/include/linux/kmod.h
-+++ b/include/linux/kmod.h
-@@ -32,4 +32,6 @@ static inline int request_module_nowait(
- #define try_then_request_module(x, mod...) (x)
- #endif
-+int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info, struct file **filp);
-+
- #endif /* __LINUX_KMOD_H__ */
---- a/include/linux/umh.h
-+++ b/include/linux/umh.h
-@@ -23,6 +23,7 @@ struct subprocess_info {
-       const char *path;
-       char **argv;
-       char **envp;
-+      struct file *stdout;
-       int wait;
-       int retval;
-       int (*init)(struct subprocess_info *info, struct cred *new);
---- a/kernel/umh.c
-+++ b/kernel/umh.c
-@@ -29,6 +29,7 @@
- #include <linux/uaccess.h>
- #include <linux/initrd.h>
- #include <linux/freezer.h>
-+#include <linux/pipe_fs_i.h>
- #include <trace/events/module.h>
-@@ -71,6 +72,28 @@ static int call_usermodehelper_exec_asyn
-       flush_signal_handlers(current, 1);
-       spin_unlock_irq(&current->sighand->siglock);
-+      /* Install output when needed */
-+      if (sub_info->stdout) {
-+              struct files_struct *f = current->files;
-+              struct fdtable *fdt;
-+
-+              sys_close(1);
-+              sys_close(2);
-+              get_file(sub_info->stdout);
-+              fd_install(1, sub_info->stdout);
-+              fd_install(2, sub_info->stdout);
-+              spin_lock(&f->file_lock);
-+              fdt = files_fdtable(f);
-+              __set_bit(1, fdt->open_fds);
-+              __clear_bit(1, fdt->close_on_exec);
-+              __set_bit(2, fdt->open_fds);
-+              __clear_bit(2, fdt->close_on_exec);
-+              spin_unlock(&f->file_lock);
-+
-+              /* disallow core files */
-+              current->signal->rlim[RLIMIT_CORE] = (struct rlimit){0, 0};
-+      }
-+
-       /*
-        * Initial kernel threads share ther FS with init, in order to
-        * get the init root directory. But we've now created a new
-@@ -330,6 +353,20 @@ static void helper_unlock(void)
-               wake_up(&running_helpers_waitq);
- }
-+int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info,
-+                                      struct file **filp)
-+{
-+      struct file *f[2];
-+
-+      if (create_pipe_files(f, 0) < 0)
-+               return PTR_ERR(f);
-+
-+      sub_info->stdout = f[1];
-+      *filp = f[0];
-+      return 0;
-+}
-+EXPORT_SYMBOL(call_usermodehelper_stdoutpipe);
-+
- /**
-  * call_usermodehelper_setup - prepare to call a usermode helper
-  * @path: path to usermode executable
diff --git a/target/linux/uml/patches-6.6/102-pseudo-random-mac.patch b/target/linux/uml/patches-6.6/102-pseudo-random-mac.patch
deleted file mode 100644 (file)
index 2b42459..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-===============================================================================
-
-This patch makes MAC addresses of network interfaces predictable. In
-particular, it adds a small routine that computes MAC addresses of based on
-a SHA1 hash of the virtual machine name and interface ID.
-
-TECHNICAL INFORMATION:
-
-Applies to vanilla kernel 3.9.4.
-
-===============================================================================
---- a/arch/um/drivers/Kconfig
-+++ b/arch/um/drivers/Kconfig
-@@ -143,6 +143,20 @@ config UML_NET
-         enable at least one of the following transport options to actually
-         make use of UML networking.
-+config UML_NET_DETERMINISTIC_MAC
-+      bool "Use deterministic MAC addresses for network interfaces"
-+      default y
-+      depends on UML_NET
-+      select CRYPTO_SHA1
-+      help
-+        Virtual network devices inside a User-Mode Linux instance must be
-+        assigned a MAC (Ethernet) address. If none is specified on the UML
-+        command line, one must be automatically computed. If this option is
-+        enabled, a randomly generated address is used. Otherwise, if this
-+        option is disabled, the address is generated from a SHA1 hash of
-+        the umid of the UML instance and the interface name. The latter choice
-+        is useful to make MAC addresses predictable.
-+
- config UML_NET_ETHERTAP
-       bool "Ethertap transport (obsolete)"
-       depends on UML_NET
---- a/arch/um/drivers/net_kern.c
-+++ b/arch/um/drivers/net_kern.c
-@@ -25,6 +25,14 @@
- #include <net_kern.h>
- #include <net_user.h>
-+#include <crypto/sha1.h>
-+#include <crypto/hash.h>
-+#include <linux/string.h>
-+#include <linux/crypto.h>
-+#include <linux/err.h>
-+#include <linux/scatterlist.h>
-+#include "os.h"
-+
- #define DRIVER_NAME "uml-netdev"
- static DEFINE_SPINLOCK(opened_lock);
-@@ -274,9 +282,55 @@ static const struct ethtool_ops uml_net_
-       .get_ts_info    = ethtool_op_get_ts_info,
- };
-+#ifdef CONFIG_UML_NET_DETERMINISTIC_MAC
-+
-+/* Compute a SHA1 hash of the UML instance's id and
-+ *  * an interface name. */
-+static int compute_hash(const char *umid, const char *ifname, char *hash)
-+{
-+      struct ahash_request *desc = NULL;
-+      struct crypto_ahash *tfm = NULL;
-+      struct scatterlist sg;
-+      char *vmif = NULL;
-+      int ret = -ENOMEM;
-+
-+      vmif = kmalloc(1024, GFP_KERNEL);
-+      if (!vmif)
-+              goto out;
-+
-+      strcpy (vmif, umid);
-+      strcat (vmif, ifname);
-+
-+      tfm = crypto_alloc_ahash("sha1", 0, CRYPTO_ALG_ASYNC);
-+      if (IS_ERR(tfm))
-+              goto out;
-+
-+      desc = ahash_request_alloc(tfm, GFP_KERNEL);
-+      if (!desc)
-+              goto out;
-+
-+      crypto_ahash_clear_flags(tfm, ~0);
-+
-+      sg_init_table(&sg, 1);
-+      sg_set_buf(&sg, vmif, strlen(vmif));
-+
-+      ahash_request_set_crypt(desc, &sg, hash, strlen(vmif));
-+
-+      ret = crypto_ahash_digest(desc);
-+out:
-+      crypto_free_ahash(tfm);
-+      ahash_request_free(desc);
-+      kfree(vmif);
-+
-+      return ret;
-+}
-+
-+#endif
-+
- void uml_net_setup_etheraddr(struct net_device *dev, char *str)
- {
-       u8 addr[ETH_ALEN];
-+      u8 hash[SHA1_DIGEST_SIZE];
-       char *end;
-       int i;
-@@ -320,9 +374,26 @@ void uml_net_setup_etheraddr(struct net_
-       return;
- random:
-+#ifndef CONFIG_UML_NET_DETERMINISTIC_MAC
-       printk(KERN_INFO
-              "Choosing a random ethernet address for device %s\n", dev->name);
-       eth_hw_addr_random(dev);
-+#else
-+      printk(KERN_INFO
-+             "Computing a digest to use as ethernet address for device %s\n", dev->name);
-+      if (compute_hash(get_umid(), dev->name, hash) < 0) {
-+              printk(KERN_WARNING
-+                     "Could not compute digest to use as ethernet address for device %s. "
-+                     "Using random address instead.\n", dev->name);
-+              eth_random_addr(addr);
-+      }
-+      else {
-+              for (i=0; i < 6; i++)
-+                      addr[i] = (hash[i] + hash[i+6]) % 0x100;
-+      }
-+      addr [0] &= 0xfe; /* clear multicast bit */
-+      addr [0] |= 0x02; /* set local assignment bit (IEEE802) */
-+#endif
- }
- static DEFINE_SPINLOCK(devices_lock);
---- a/kernel/umh.c
-+++ b/kernel/umh.c
-@@ -354,12 +354,12 @@ static void helper_unlock(void)
- }
- int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info,
--                                      struct file **filp)
-+                                 struct file **filp)
- {
-       struct file *f[2];
-       if (create_pipe_files(f, 0) < 0)
--               return PTR_ERR(f);
-+              return PTR_ERR(f);
-       sub_info->stdout = f[1];
-       *filp = f[0];